package interfazGrafica.Grafo;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.UIManager;

import consultas.ConsultaA;
import consultas.ConsultaB;
import estructuraGrafo.Grafo;

/**Clase de interfaz: interfaz para seleccionar el peaje inicio y destino
 * 
 * @author Grupo N11
 * @author  Prinsich, Bernz, Emilio J. A.
 * @author  Solia, Guillermo, D.
 * @version 1.0
 */
public class Ruta extends JFrame {

	/** Variable que contiene el grafo del cual obtener los peajes*/	
	private Grafo grafo;
	/**Variable que contiene un JTextArea para poder setear su valor*/
	private JTextArea area;
	/**Variable que contiene la option(0:ConsutaA; 1:ConsultaB)*/
	private int option;

	/**ID que contiene el versionaje de la clase*/ 
	private static final long serialVersionUID = 1L;
	/**Variable que contiene la etiqueta "Desde"*/
	private JLabel jLabel0;
	/**Variable que contiene la etiqueta "Hasta"*/
	private JLabel jLabel1;
	/**Boton "Cancelar"*/
	private JButton jButton1;
	/**Boton "Aceptar"*/
	private JButton jButton0;
	/**Lista desplegable superoir*/
	private JComboBox jComboBox0;
	/**Lsta desplegable inferiro*/
	private JComboBox jComboBox1;
	
	/**Lista de Aristas y pintos*/
	private static ArrayList<Arista> aristas;
	private static ArrayList<Punto> puntos;
	private static Lienzo lienzo;

	private static final String PREFERRED_LOOK_AND_FEEL = "javax.swing.plaf.metal.MetalLookAndFeel";
	
	/**Constructor de la clase
	 * 
	 */
	public Ruta() {
		initComponents();
	}

	/**Inicializa los componentes Swing y AWT*/
	private void initComponents() {
		setLayout(null);
		add(getJLabel0());
		add(getJLabel1());
		add(getJButton1());
   	    add(getJButton0());
		add(getJComboBox0());
		add(getJComboBox1());
		setSize(281, 202);
	}

	/**Setea la lista deplegable inferior
	 * 
	 * @return
	 * 		Lista desplegable seteada
	 */
	private JComboBox getJComboBox1() {
		if (jComboBox1 == null) {
			jComboBox1 = new JComboBox();
			jComboBox1.setModel(new DefaultComboBoxModel(new Object[] {}));
			jComboBox1.setDoubleBuffered(false);
			jComboBox1.setBorder(null);
			jComboBox1.setBounds(70, 74, 142, 25);
		}
		return jComboBox1;
	}

	/**Setea lista desplegable superior
	 * 
	 * @return
	 * 		Lista desplegable seteada
	 */
	private JComboBox getJComboBox0() {
		if (jComboBox0 == null) {
			jComboBox0 = new JComboBox();
			jComboBox0.setModel(new DefaultComboBoxModel(new Object[] {}));
			jComboBox0.setDoubleBuffered(false);
			jComboBox0.setBorder(null);
			jComboBox0.setBounds(71, 26, 140, 25);
		}
		return jComboBox0;
	}
	
	/**Coloca los peajes en ambas listas desplegables
	 * 
	 * @param peajes
	 * 				Lista de peajes
	 */
	public void setComboBoxs(ArrayList<String> peajes){
		for(int i = 0; i < peajes.size(); i++){
			jComboBox0.addItem(peajes.get(i));
			jComboBox1.addItem(peajes.get(i));
		}
	}
	
	/**Setea grafo y llama a setComboBoxs para colocar sus nodos en ambas listas desplegables
	 * 
	 * @param unGrafo
	 * 				Un Grafo
	 */
	public void setGrafo(Grafo unGrafo){ 
		grafo = unGrafo;
		setComboBoxs(grafo.getNombres());
	}
	
	/** Setea el contenido de area
	 * 
	 * @param unaArea
	 * 				Un JTextArea
	 */
	public void setArea(JTextArea unaArea){
		area = unaArea;
	}
	
	/**Setea el contenido de option
	 * 
	 * @param unaOption
	 * 					Un int
	 */
	public void setOption(int unaOption){
		option = unaOption;
	}
	
	/**Setea el contenido del boton "Aceptar" y crea un evento para responder a alguna consulta y cerrar la ventana
	 * 
	 * @return
	 * 		Boton "Aceptar" seteado
	 */
	private JButton getJButton0() {
		if (jButton0 == null) {
			jButton0 = new JButton();
			jButton0.setText("Aceptar");
			jButton0.setBounds(37, 148, 97, 26);
			jButton0.addMouseListener(new MouseAdapter() {
	
				public void mouseClicked(MouseEvent event) {
					jButton0MouseMouseClicked(event);
				}
			});
		}
		return jButton0;
	}

	/**Setea el contenido del boton "Cancelar" y crea un evento para cerrar la ventana
	 * 
	 * @return
	 * 		Boton "Cancelar" seteado
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setText("Cancelar");
			jButton1.setBounds(158, 147, 97, 26);
			jButton1.addMouseListener(new MouseAdapter() {
	
				public void mouseClicked(MouseEvent event) {
					jButton1MouseMouseClicked(event);
				}
			});
		}
		return jButton1;
	}

	/**Setea la etiqueta "Hasta"
	 * 
	 * @return
	 * 		Etiqueta "Hasta" seteada
	 */
	private JLabel getJLabel1() {
		if (jLabel1 == null) {
			jLabel1 = new JLabel();
			jLabel1.setText("Hasta");
			jLabel1.setBounds(19, 81, 41, 16);
		}
		return jLabel1;
	}

	/**Setea la etiqueta "Desde"
	 * 
	 * @return
	 * 		Etiqueta "Desde" seteada
	 */
	private JLabel getJLabel0() {
		if (jLabel0 == null) {
			jLabel0 = new JLabel();
			jLabel0.setText("Desde");
			jLabel0.setBounds(18, 30, 41, 16);
		}
		return jLabel0;
	}

	/**Nos permite iniciar nuestra aplicacion grafica con el look del windows en donde corra la Aplicacion*/ 
	@SuppressWarnings("unused")
	private static void installLnF() {
		try {
			String lnfClassname = PREFERRED_LOOK_AND_FEEL;
			if (lnfClassname == null)
				lnfClassname = UIManager.getCrossPlatformLookAndFeelClassName();
			UIManager.setLookAndFeel(lnfClassname);
		} catch (Exception e) {
			System.err.println("Cannot install " + PREFERRED_LOOK_AND_FEEL
					+ " on this platform:" + e.getMessage());
		}
	}
	/**Metodo que nos permite invocar este Frame desde otra clase
	 * 
	 * @param unGrafo
	 * 				El Grafo con el cual completaremos nuestras lista desplegables 
	 * @param unaArea
	 * 				Un JTextArea en el cual se seteara el resultado de algunas de las consultas (A o B)
	 * @param unaOption
	 *				0:ConsultaA y 1:ConsultaB
	 */				
	public static void ejecutar(Grafo unGrafo, JTextArea unaArea,int unaOption){
		Ruta frame = new Ruta();
		frame.setGrafo(unGrafo);
		frame.setArea(unaArea);
		frame.setOption(unaOption);
		frame.setDefaultCloseOperation(Ruta.EXIT_ON_CLOSE);
		frame.setTitle("Ruta");
		frame.getContentPane().setPreferredSize(frame.getSize());
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		frame.requestFocus();
	}

	/**Evento del boton "Aceptar" para responder a una consulta A o B y cerrar la ventana
	 * 
	 * @param event
	 * 				Evento
	 */
	private void jButton0MouseMouseClicked(MouseEvent event) {
		try{
			if(option == 0){
				ConsultaA consulta = new ConsultaA();
				consulta.consultar(grafo,(String)(jComboBox0.getSelectedItem()),(String)(jComboBox1.getSelectedItem()));
				area.setText(consulta.getText());
				dispose();
				consulta.pintar(aristas,puntos);
				lienzo.repaint();
			}
			if(option == 1){
				ConsultaB consulta = new ConsultaB();
				consulta.consultar(grafo,(String)(jComboBox0.getSelectedItem()),(String)(jComboBox1.getSelectedItem()));
				area.setText(consulta.getText());
				dispose();
				consulta.pintar(aristas,puntos);
				lienzo.repaint();
			}
		}
		catch(Exception e){
			area.setText(e.getMessage());
			dispose();
		}
	}

	/**Evento del boton "Cancelar" para cerrar la ventana
	 * 
	 * @param event
	 * 				Evento
	 */
	private void jButton1MouseMouseClicked(MouseEvent event) {
		dispose();
	}

	public static void set(ArrayList<Arista> aristas2, ArrayList<Punto> puntos2, Lienzo lienzo2) {
		aristas=aristas2;
		puntos=puntos2;
		lienzo=lienzo2;
	}

}
